package common

import (
	"fmt"
	"regexp"
)

const (
	PnpClassAudioEndpoint         = "AudioEndpoint"         // 音频终端设备
	PnpClassVideoEndpoint         = "VideoEndpoint"         // 音频终端设备
	PnpClassAudioProcessingObject = "AudioProcessingObject" // 音频处理对象
	PnpClassBattery               = "Battery"               // 电池设备
	PnpClassBiometric             = "Biometric"             // 生物识别设备
	PnpClassBluetooth             = "Bluetooth"             // 蓝牙设备
	PnpClassCamera                = "Camera"                // 摄像头设备
	PnpClassComputer              = "Computer"              // 计算机系统设备
	PnpClassDiskDrive             = "DiskDrive"             // 磁盘驱动器
	PnpClassDisplay               = "Display"               // 显示设备
	PnpClassFirmware              = "Firmware"              // 固件设备
	PnpClassHIDClass              = "HIDClass"              // 人机接口设备（键盘/鼠标/游戏手柄等）
	PnpClassImage                 = "Image"                 // 图像设备（扫描仪/相机）
	PnpClassKeyboard              = "Keyboard"              // 键盘设备
	PnpClassMEDIA                 = "MEDIA"                 // 媒体设备
	PnpClassMonitor               = "Monitor"               // 显示器设备
	PnpClassMouse                 = "Mouse"                 // 鼠标设备
	PnpClassNet                   = "Net"                   // 网络设备
	PnpClassPorts                 = "Ports"                 // 端口设备（COM/LPT）
	PnpClassPrintQueue            = "PrintQueue"            // 打印队列
	PnpClassProcessor             = "Processor"             // 处理器设备
	PnpClassPureComputeInputKMDF  = "PureComputeInputKMDF"  // 特定厂商的计算输入设备
	PnpClassSCSIAdapter           = "SCSIAdapter"           // SCSI适配器
	PnpClassSecurityDevices       = "SecurityDevices"       // 安全设备
	PnpClassSoftwareComponent     = "SoftwareComponent"     // 软件组件
	PnpClassSoftwareDevice        = "SoftwareDevice"        // 软件设备
	PnpClassSystem                = "System"                // 系统设备（最通用的类别）
	PnpClassUCM                   = "UCM"                   // USB连接管理器（USB Type-C相关）
	PnpClassUSB                   = "USB"                   // USB控制器和集线器
	PnpClassUSBDevice             = "USBDevice"             // USB设备
	PnpClassVolume                = "Volume"                // 存储卷
	PnpClassVolumeSnapshot        = "VolumeSnapshot"        // 卷快照
	PnpClassWPD                   = "WPD"                   // Windows便携设备（手机/媒体播放器等）
	PnpClassMassStorage           = "MassStorage"
	PnpClassCdcData               = "CDC-Data"            //	通信设备数据类
	PnpClassWirelessController    = "Wireless Controller" //	无线控制器（蓝牙、WiFi适配器）
	PnpClassSelfVendor            = "Vendor Specific"     //厂商自定义设备
)

// 按功能分类的分组常量
const (
	PnpCategoryInput      = "Input"      // 输入设备类别（鼠标/键盘等）
	PnpCategoryStorage    = "Storage"    // 存储设备类别
	PnpCategoryMultimedia = "Multimedia" // 多媒体设备类别
	PnpCategoryNetwork    = "Network"    // 网络设备类别
	PnpCategorySystem     = "System"     // 系统核心设备类别
	PnpCategoryPeripheral = "Peripheral" // 外围设备类别
)

// 获取所有输入设备类型的切片
func InputDeviceClasses() []string {
	return []string{
		PnpClassMouse,
		PnpClassKeyboard,
		PnpClassHIDClass,
		PnpClassBiometric,
	}
}

// 根据类别获取设备类型列表
func ClassesByCategory(category string) []string {
	switch category {
	case PnpCategoryInput:
		return []string{
			PnpClassMouse,
			PnpClassKeyboard,
			PnpClassHIDClass,
			PnpClassBiometric,
		}
	case PnpCategoryStorage:
		return []string{
			PnpClassDiskDrive,
			PnpClassVolume,
			PnpClassVolumeSnapshot,
			PnpClassSCSIAdapter,
		}
	case PnpCategoryMultimedia:
		return []string{
			PnpClassAudioEndpoint,
			PnpClassAudioProcessingObject,
			PnpClassCamera,
			PnpClassMEDIA,
			PnpClassWPD,
		}
	case PnpCategoryNetwork:
		return []string{
			PnpClassNet,
			PnpClassBluetooth,
		}
	case PnpCategorySystem:
		return []string{
			PnpClassSystem,
			PnpClassProcessor,
			PnpClassFirmware,
			PnpClassComputer,
		}
	case PnpCategoryPeripheral:
		return []string{
			PnpClassUSB,
			PnpClassUSBDevice,
			PnpClassDisplay,
			PnpClassMonitor,
		}
	default:
		return []string{}
	}
}

func ExtractVidPid(input string) (vid, pid string, err error) {
	// 正则表达式匹配多种格式：
	// 1. (0000:3282)
	// 2. 0000:3282
	// 3. VID_0000&PID_3282
	// 4. 0000 3282 (带空格)
	re := regexp.MustCompile(`(?i)[\(]?(\w{4})[:&\s](\w{4})[\)]?`)

	matches := re.FindStringSubmatch(input)
	if len(matches) < 3 {
		return "", "", fmt.Errorf("未找到有效的VID/PID")
	}

	return matches[1], matches[2], nil
}

func GetPnpClassInterfaceClass(class int) string {
	if class == 0x01 {
		return PnpClassAudioEndpoint //	Audio 音频设备（如麦克风、扬声器）
	}
	if class == 0x02 {
		return PnpClassNet // Communications 通信设备（如调制解调器）
	}
	if class == 0x03 {
		return PnpClassHIDClass // 人机接口设备（键盘、鼠标等)
	}
	if class == 0x08 {
		return PnpClassMassStorage //大容量存储设备（U盘、移动硬盘）
	}
	if class == 0x09 {
		return PnpClassUSB //hub 	USB集线器
	}
	if class == 0x0A {
		return PnpClassCdcData //	CDC-Data 通信设备数据类
	}
	if class == 0x0E {
		return PnpClassVideoEndpoint //	Video 	视频设备（摄像头）
	}
	if class == 0xE0 {
		return PnpClassWirelessController //Wireless Controller 	无线控制器（蓝牙、WiFi适配器）
	}
	if class == 0xFF {
		return PnpClassSelfVendor //Vendor Specific 	厂商自定义设备
	}

	return ""
}

func GetPnpSubInterfaceProtocol(class int) string {
	if class == 0x01 {
		return PnpClassKeyboard
	}

	if class == 0x02 {
		return PnpClassMouse
	}

	return ""
}
